﻿using GamFi.Admin.API.Application.Contracts.Country.AddCountry;
using GamFi.Admin.API.Application.Contracts.Country.GetCountries;
using GamFi.Admin.API.Application.Contracts.Country.UpdateCountry;
using GamFi.Admin.API.Application.Features.Queries.Country.AddCountry;
using GamFi.Admin.API.Application.Features.Queries.Country.DeleteCountry;
using GamFi.Admin.API.Application.Features.Queries.Country.GetCountries;
using GamFi.Admin.API.Application.Features.Queries.Country.UpdateCountry;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace GamFi.Admin.API.WEB.Controllers;

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class CountryController(IMediator mediator) : ControllerBase
{
    /// <summary>
    /// Получает список всех стран.
    /// </summary>
    /// <param name="request"></param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий список всех стран.</returns>
    [HttpGet("GetCountries")]
    public async Task<GetCountriesResponse> GetCountries([FromQuery] GetCountriesRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new GetCountriesQuery(request), cancellationToken);

    /// <summary>
    /// Добавляет новую страну.
    /// </summary>
    /// <param name="request">Запрос на добавление страны.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат добавления.</returns>
    [HttpPost("AddCountry")]
    public async Task AddCountry(AddCountryRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new AddCountryCommand(request), cancellationToken);

    /// <summary>
    /// Обновляет информацию о стране.
    /// </summary>
    /// <param name="request">Запрос на обновление информации о стране.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат обновления.</returns>
    [HttpPut("UpdateCountry")]
    public async Task UpdateCountry(UpdateCountryRequest request, CancellationToken cancellationToken)
        => await mediator.Send(new UpdateCountryCommand(request), cancellationToken);

    /// <summary>
    /// Удаляет страну по ее идентификатору.
    /// </summary>
    /// <param name="id">Идентификатор страны, которую требуется удалить.</param>
    /// <param name="cancellationToken">Токен отмены операции.</param>
    /// <returns>Ответ, содержащий результат удаления.</returns>
    [HttpDelete("DeleteCountry/{id:guid}")]
    public async Task DeleteCountry(Guid id, CancellationToken cancellationToken)
        => await mediator.Send(new DeleteCountryCommand(id), cancellationToken);
}